home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2000 #5 / Amiga Plus CD - 2000 - No. 5.iso / Tools / Dev / fpc / utilunits / amigautils.pas next >
Pascal/Delphi Source File  |  2000-01-01  |  5KB  |  192 lines

  1. {
  2.     This file is part of the Free Pascal run time library.
  3.  
  4.     A file in Amiga system run time library.
  5.     Copyright (c) 1998-2000 by Nils Sjoholm
  6.     member of the Amiga RTL development team.
  7.  
  8.     See the file COPYING.FPC, included in this distribution,
  9.     for details about the copyright.
  10.  
  11.     This program is distributed in the hope that it will be useful,
  12.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  14.  
  15.  **********************************************************************}
  16.  
  17. {
  18.    This is just a temporary unit I made for some of
  19.    my demos. I hope it will vanish in time.
  20.  
  21.    nils.sjoholm@mailbox.swipnet.se
  22. }
  23.  
  24. unit amigautils;
  25.  
  26. interface
  27.  
  28. uses strings;
  29.  
  30. function ExtractFilePath(FileName: PChar): PChar;
  31. function FileType(thefile :  PChar): Longint;
  32. Function PathAndFile(Path,FName : PChar): PChar;
  33. FUNCTION PathOf(Name : PChar): PChar;
  34.  
  35. Function LongToStr (I : Longint) : String;
  36.  
  37. implementation
  38.  
  39. type
  40.     pDateStamp = ^tDateStamp;
  41.     tDateStamp = record
  42.         ds_Days         : Longint;      { Number of days since Jan. 1, 1978 }
  43.         ds_Minute       : Longint;      { Number of minutes past midnight }
  44.         ds_Tick         : Longint;      { Number of ticks past minute }
  45.     end;
  46.  
  47. {$PACKRECORDS 4}
  48. Type
  49.  
  50. { Returned by Examine() and ExInfo(), must be on a 4 byte boundary }
  51.  
  52.     pFileInfoBlock = ^tFileInfoBlock;
  53.     tFileInfoBlock = record
  54.         fib_DiskKey      : Longint;
  55.         fib_DirEntryType : Longint;
  56.                         { Type of Directory. If < 0, then a plain file.
  57.                           If > 0 a directory }
  58.         fib_FileName     : Array [0..107] of Char;
  59.                         { Null terminated. Max 30 chars used for now }
  60.         fib_Protection   : Longint;
  61.                         { bit mask of protection, rwxd are 3-0. }
  62.         fib_EntryType    : Longint;
  63.         fib_Size         : Longint;      { Number of bytes in file }
  64.         fib_NumBlocks    : Longint;      { Number of blocks in file }
  65.         fib_Date         : tDateStamp;   { Date file last changed }
  66.         fib_Comment      : Array [0..79] of Char;
  67.                         { Null terminated comment associated with file }
  68.         fib_OwnerUID     : Word;
  69.         fib_OwnerGID     : Word;
  70.         fib_Reserved     : Array [0..31] of Char;
  71.     end;
  72.  
  73. {$PACKRECORDS NORMAL}
  74.  
  75. FUNCTION Examine(lock : LONGINT; fileInfoBlock : pFileInfoBlock) : BOOLEAN;
  76. BEGIN
  77.   ASM
  78.     MOVE.L  A6,-(A7)
  79.     MOVE.L  lock,D1
  80.     MOVE.L  fileInfoBlock,D2
  81.     MOVEA.L _DOSBase,A6
  82.     JSR -102(A6)
  83.     MOVEA.L (A7)+,A6
  84.     TST.L   D0
  85.     BEQ.B   @end
  86.     MOVEQ   #1,D0
  87.     @end: MOVE.B  D0,@RESULT
  88.   END;
  89. END;
  90.  
  91. FUNCTION Lock(name : pCHAR; type_ : LONGINT) : LONGINT;
  92. BEGIN
  93.   ASM
  94.     MOVE.L  A6,-(A7)
  95.     MOVE.L  name,D1
  96.     MOVE.L  type_,D2
  97.     MOVEA.L _DOSBase,A6
  98.     JSR -084(A6)
  99.     MOVEA.L (A7)+,A6
  100.     MOVE.L  D0,@RESULT
  101.   END;
  102. END;
  103.  
  104. PROCEDURE UnLock(lock : LONGINT);
  105. BEGIN
  106.   ASM
  107.     MOVE.L  A6,-(A7)
  108.     MOVE.L  lock,D1
  109.     MOVEA.L _DOSBase,A6
  110.     JSR -090(A6)
  111.     MOVEA.L (A7)+,A6
  112.   END;
  113. END;
  114.  
  115. FUNCTION PCharCopy(s: PChar; thepos , len : Longint): PChar;
  116. VAR
  117.     dummy : PChar;
  118. BEGIN
  119.     getmem(dummy,len+1);
  120.     dummy := strlcopy(dummy,@s[thepos],len);
  121.     PCharCopy := dummy;
  122. END;
  123.  
  124.  
  125. function ExtractFilePath(FileName: PChar): PChar;
  126. var
  127.   I: Longint;
  128. begin
  129.   I := strlen(FileName);
  130.   while (I > 0) and not ((FileName[I] = '/') or (FileName[I] = ':')) do Dec(I);
  131.   ExtractFilePath := PCharCopy(FileName, 0, I+1);
  132. end;
  133.  
  134. function FileType(thefile :  PChar): Longint;
  135. VAR
  136.    fib  :  pFileInfoBlock;
  137.    mylock : Longint;
  138.    mytype : Longint;
  139. begin
  140.    mytype := 0;
  141.    new(fib);
  142.    mylock := Lock(thefile, -2);
  143.    IF mylock <> 0 THEN begin
  144.        IF Examine(mylock, fib) THEN begin
  145.            mytype := fib^.fib_DirEntryType;
  146.            UnLock(mylock);
  147.        END;
  148.     END;
  149.     dispose(fib);
  150.     FileType := mytype
  151. END;
  152.  
  153. Function PathAndFile(Path,FName : PChar): PChar;
  154. var
  155.     LastChar : CHAR;
  156.     Temparray : ARRAY [0..255] OF CHAR;
  157.     Temp     : PChar;
  158. BEGIN
  159.     Temp := @Temparray;
  160.     if strlen(Path) > 0 then begin
  161.         strcopy(Temp, Path);
  162.         LastChar := Temp[Pred(strlen(Temp))];
  163.         if (LastChar <> '/') and (LastChar <> ':') then
  164.             strcat(Temp, PChar('/'#0));
  165.         if strlen(FName) > 0 then
  166.             strcat(Temp,FName);
  167.     end;
  168.     if strlen(Temp) > 0 then begin
  169.         PathAndFile := PCharCopy(Temp,0,Strlen(Temp));
  170.     end else begin
  171.         PathAndFile := nil;
  172.     end;
  173. end;
  174.  
  175. FUNCTION PathOf(Name : PChar): PChar;
  176. begin
  177.     PathOf := ExtractFilePath(Name);
  178. end;
  179.  
  180. Function LongToStr (I : Longint) : String;
  181. Var
  182.     S : String;
  183. begin
  184.     Str (I,S);
  185.     LongToStr:=S;
  186. end;
  187.  
  188.  
  189. end.
  190.  
  191.  
  192.